/*
 *Autor: Anderson Campos Cardoso
 *
 *Conteúdo: definição dos métodos para a classe Processos
 */

/*
#include <iostream>
#include <SDL/SDL.h>
*/
#include "Processos.h"

#ifndef _PROCESSOS_CPP_
#define _PROCESSOS_CPP_


/*
 *Identifica qual tecla foi pressionada
 */
int Processos::pressionarTecla(SDL_Event *evento)
{
   int quit = 0;
   switch(evento->key.keysym.sym)
   {
      case SDLK_RIGHT:
         tecla->setDireita(true);
         break;
      case SDLK_LEFT:
         tecla->setEsquerda(true);
         break;
      case SDLK_DOWN:
         tecla->setBaixo(true);
         break;
      case SDLK_UP:
         tecla->setCima(true);
         break;
      case SDLK_ESCAPE:
         quit = 1;
         break;
      case SDLK_RETURN:
         tecla->setEnter(true);
         break;
      default:

         break;
   }
   return quit;
}

/*
 *Identifica qual tecla foi solta no teclado
 */
void Processos::soltarTecla(SDL_Event *evento)
{
   switch(evento->key.keysym.sym)
   {
      case SDLK_RIGHT:
         tecla->setDireita(false);
         break;
      case SDLK_LEFT:
        tecla->setEsquerda(false);
         break;
      case SDLK_DOWN:
         tecla->setBaixo(false);
         break;
      case SDLK_UP:
         tecla->setCima(false);
         break;
      case  SDLK_KP_ENTER:
         tecla->setEnter(false);
         break;

      default:

         break;
	}
}

/*
 *Inicia os subsistemas da SDL
 */
void Processos::iniciarSistemas(void)
{
   janela->iniciaVideo();       /*inicia subsistema de vídeo*/
   audio->iniciaAudio();        /*inicia subsistema de áudio*/
   relogio->iniciarContagem();  /*inicia subsistema de contagem de tempo*/
   if(TTF_Init() < 0)
   {
      cout << "Erro em Processos::iniciarSistemas(void)" << TTF_GetError() << "\n" <<SDL_GetError() << endl;
   }
}

void Processos::encerrarSistemas(void)
{
   TTF_Quit();
   SDL_Quit();
}

/*Identifica qual o evento e executa as ações de sair ou identifica as telcas pressionadas no objeto tecla da classe MapaTeclas*/
int Processos::processaEvento(SDL_Event *evento)
{
   switch(evento->type)
   {
      case SDL_QUIT:
         quit = 1;
         break;
      case SDL_KEYDOWN:
         quit = pressionarTecla(evento);
         break;
      case SDL_KEYUP:
         soltarTecla(evento);
         break;
      default:
         break;

   }
   return quit;
}

/*
 *
 */
void Processos::trocarEstado(int retorno)
{
   estadoCorrente->Descarregar();
   delete(estadoCorrente);
   switch(retorno)
   {
      case 1:
         estadoCorrente = new EstadoInicial();
         break;

      case 2:
         estadoCorrente = new EstadoJogando();
         break;
   }
   estadoCorrente->Carregar(janela, audio, relogio);
}

void Processos::Jogar(void)
{
   int retorno = 0;
   estadoCorrente->Carregar(janela, audio, relogio);
   while (quit == 0)
   {

      /*Enquanto houver algum evento na fila este é processado*/
      while(SDL_PollEvent(&evento))
      {
         SDL_Delay(1); /*Espera um milisegundos para evitar sobrecarga do processador*/
         quit = processaEvento(&evento); //identifica as teclas pressionadas
      }

      retorno = estadoCorrente->atualizar(tecla, audio);
      estadoCorrente->Desenhar(janela,audio);

      /*Abaixo esta o processamento de mudança de estados*/
      if (retorno != 0)
      {
         trocarEstado(retorno);
         retorno = 0;
      }

      relogio->fimLoop(); /*não limita o frame rate*/
      //relogio->esperar();  /*limita o frame rate*/

   }/*fim do while(quit == 0)*/

   estadoCorrente->Descarregar();
}

/*
 *Construtor da classe
 */
Processos::Processos(void)
{
   quit           = 0;
   tecla          = new MapaTeclas();
   janela         = new Video();
   audio          = new Audio();
   estadoCorrente = new EstadoInicial();
   relogio        = new Relogio();
   iniciarSistemas();
}

/*
 *Destrutor da classe
 */
Processos::~Processos(void)
{
   delete(tecla);
   delete(janela);
   delete(audio);
   delete(estadoCorrente);
   delete(relogio);
   encerrarSistemas();
}

#endif

